/**
 * XMacro               常用宏
 * @author              罗伟权
 * @createdate          2013-05-16
 * @version             1.0
 */

#ifndef _XMACRO_H_
#define _XMACRO_H_


/**
 * 详细日志
 * 在原来日志信息的基础上，加入文件及行号信息，方便定位
 * @param       x，需要输出的信息
 */
#ifndef XLOG
#ifdef DEBUG
#define XLOG(x)               \
NSString *strFile = [NSString stringWithUTF8String:__FILE__]; \
NSRange range = [strFile rangeOfString:@"/" options:NSBackwardsSearch]; \
NSLog(@"文件：%@ 中，第 %d 行 >> %@", [strFile substringFromIndex:(range.length > 0 ? range.location + 1 : 0)], __LINE__, x);
#else
#define XLOG(x)
#endif
#endif


/**
 * 参数校验
 * 校验 Object 对象是否为 nil
 * 注意，无返回值时，可以如此调用： VERIFY_OBJECT(x,);，逗号要写，但第二参数不写
 * @param       x, 需要校验的 Object 对象
 * @param       r, 校验失败时，需要返回的数据
 */
#ifndef none
#define none
#endif

#ifndef VERIFY_OBJECT
#ifdef DEBUG
#define VERIFY_OBJECT(x, r)         \
if (nil == x) { \
    NSString *strFile = [NSString stringWithUTF8String:__FILE__]; \
    NSRange range = [strFile rangeOfString:@"/" options:NSBackwardsSearch]; \
    NSLog(@"文件：%@ 中，第 %d 行 >> 参数 %s 异常！", [strFile substringFromIndex:(range.length > 0 ? range.location + 1 : 0)], __LINE__, #x); \
    return r; \
}
#else
#define VERIFY_OBJECT(x, r)         \
if (nil == x) { \
    return r; \
}
#endif
#endif

/**
 * 参数校验
 * 校验 NSString 对象是否为 nil 或 无数据
 * 注意，无返回值时，可以如此调用： VERIFY_STRING(x,);，逗号要写，但第二参数不写
 * @param       x, 需要校验的 Object 对象
 * @param       r, 校验失败时，需要返回的数据
 */
#ifndef VERIFY_STRING
#ifdef DEBUG
#define VERIFY_STRING(x, r)         \
if (nil == x || x.length == 0) { \
    NSString *strFile = [NSString stringWithUTF8String:__FILE__]; \
    NSRange range = [strFile rangeOfString:@"/" options:NSBackwardsSearch]; \
    NSLog(@"文件：%@ 中，第 %d 行 >> 参数 %s 异常！", [strFile substringFromIndex:(range.length > 0 ? range.location + 1 : 0)], __LINE__, #x); \
    return r; \
}
#else
#define VERIFY_STRING(x, r)         \
if (nil == x || x.length == 0) { \
    return r; \
}
#endif
#endif

/**
 * 参数校验
 * 校验 NSArray 对象是否为 nil 或 无数据
 * 注意，无返回值时，可以如此调用： VERIFY_STRING(x,);，逗号要写，但第二参数不写
 * @param       x, 需要校验的 Object 对象
 * @param       r, 校验失败时，需要返回的数据
 */
#ifndef VERIFY_ARRAY
#ifdef DEBUG
#define VERIFY_ARRAY(x, r)         \
if (nil == x || x.count == 0) { \
NSString *strFile = [NSString stringWithUTF8String:__FILE__]; \
NSRange range = [strFile rangeOfString:@"/" options:NSBackwardsSearch]; \
NSLog(@"文件：%@ 中，第 %d 行 >> 参数 %s 异常！", [strFile substringFromIndex:(range.length > 0 ? range.location + 1 : 0)], __LINE__, #x); \
return r; \
}
#else
#define VERIFY_ARRAY(x, r)         \
if (nil == x || x.count == 0) { \
return r; \
}
#endif
#endif

#endif
